#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 读取输入图像
    cv::Mat image = cv::imread("../roi_img.jpg"); // 替换为你的图像路径
    if (image.empty()) {
        std::cerr << "请确保图像路径正确且文件存在！" << std::endl;
        return -1;
    }

    // 获取图像的高度和宽度
    int h = image.rows;
    int w = image.cols;
    std::cout << "(h, w) = (" << h << ", " << w << ")" << std::endl;

    // 1. 缩放 (Scaling)
    double scale = 0.5; // 缩放比例（小于1缩小，大于1放大）
    cv::Mat resized;
    cv::resize(image, resized, cv::Size(static_cast<int>(w * scale), static_cast<int>(h * scale)));

    // 2. 平移 (Translation)
    int tx = 100, ty = 50; // 水平方向平移 100 像素，竖直方向平移 50 像素
    cv::Mat translation_matrix = (cv::Mat_<float>(2, 3) << 1, 0, tx, 0, 1, ty);
    cv::Mat translated;
    cv::warpAffine(image, translated, translation_matrix, image.size());

    // 3. 旋转 (Rotation)
    double angle = 45.0; // 顺时针旋转 45 度
    cv::Point2f center(w / 2.0, h / 2.0); // 图像中心
    cv::Mat rotation_matrix = cv::getRotationMatrix2D(center, angle, 1.0);
    cv::Mat rotated;
    cv::warpAffine(image, rotated, rotation_matrix, image.size());

    // 4. 仿射变换 (Affine Transformation)
    std::vector<cv::Point2f> src_points = { {50, 50}, {200, 50}, {50, 200} }; // 原始图像中的三个点
    std::vector<cv::Point2f> dst_points = { {10, 100}, {200, 50}, {100, 250} }; // 目标图像中的三个点
    cv::Mat affine_matrix = cv::getAffineTransform(src_points, dst_points);
    cv::Mat affine_transformed;
    cv::warpAffine(image, affine_transformed, affine_matrix, image.size());

    // 5. 透视变换 (Perspective Transformation)
    std::vector<cv::Point2f> src_corners = { {0, 0}, {static_cast<float>(w - 1), 0}, {0, static_cast<float>(h - 1)}, {static_cast<float>(w - 1), static_cast<float>(h - 1)} };
    std::vector<cv::Point2f> dst_corners = { {50, 50}, {w - 50, 100}, {50, h - 50}, {w - 100, h - 100} };
    cv::Mat perspective_matrix = cv::getPerspectiveTransform(src_corners, dst_corners);
    cv::Mat perspective_transformed;
    cv::warpPerspective(image, perspective_transformed, perspective_matrix, image.size());

    // 显示结果
    cv::imshow("01 Original Image", image); // 原始图像
    cv::imshow("02 Resized", resized);      // 缩放后的图像
    cv::imshow("03 Translated", translated); // 平移后的图像
    cv::imshow("04 Rotated", rotated);      // 旋转后的图像
    cv::imshow("05 Affine Transformed", affine_transformed); // 仿射变换后的图像
    cv::imshow("06 Perspective Transformed", perspective_transformed); // 透视变换后的图像

    // 等待用户按键关闭窗口
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}
